#ifndef DATABASE_H
#define DATABASE_H

#include "Debug.h"
#include "DBStruct.h"

#include <iostream>
#include <sstream>
#include <mysql/mysql.h>
#include <list>
#include <map>


using namespace std;

/*
// 实例
	char* host = "127.0.0.1";
	char* user = "root";
	char* pwd = "123123";
	char* db = "tkdb";

	Database myDb;
	myDb.Init(host, user, pwd, db);
	char* sql = "SELECT * FROM tUser;";
	myDb.Query(sql);
	// 打印获取数据行数
	cout<< "u got "<< myDb.m_row<< "records."<< endl;
	myDb.Dispose();
*/



class Database
{
	public:
		Database();
		~Database();

		// 初始化
		int Init(string host, string user, string pwd, string db);

		// 加载数据库数据
		bool LoadInit();

		// 释放
		void Dispose();

		// 表 查询
		int Query(string sql);

		// 表 添加
		int Insert(string sql);

		// 表 删除
		int Drop(string sql);

		// 表 更新
		int Update(string sql);

		// 保存到数据库
		void SaveAll();

		MYSQL_RES* mp_Result; 		 		// 上次执行查询的结果
		int m_row;
		int m_cols;

	protected:
	private:
		// 链接
		int Connect();

		// 执行sql语句
		int RunSql(string sql);

		char* mp_host; 						// 数据库所在主机IP地址
		char* mp_user;  					// 账户
		char* mp_pwd; 						// 密码
		char* mp_db; 						// 数据库名称

		MYSQL m_Mysql; 						// mysql 对象

		bool m_isInit; 						// 是否初始化
		bool m_isConnect;					// 是否链接

		map<int, tGlobal> m_GlobalMap; 		// 全局表
		map<int, tUser> m_UserMap; 			// 账户表
		map<int, tPlayer> m_PlayerMap; 		// 玩家表
		map<int, tRole> m_RoleMap;			// 角色表

	public:
				// 测试方法
		int TestFunc(string sql);

		int LoadGlobal();
		bool IsFindGlobal(int _key);
		tGlobal* SelectGlobal(int _key);
		int InsertGlobal(const tGlobal& _Global);
		bool UpdateGlobal(const tGlobal& _Global);
		const map<int, tGlobal>& GetGlobalMap();

		bool IsFindUser(string _user);
		tUser* SelectUser(string _user);
		int InsertUser(const tUser& _User);

		bool CachePlayer(MYSQL_ROW Row);
		bool IsExistPlayer(int _playerId);
		int InsertPlayer(const tPlayer& _Player);
		tPlayer* SelectPlayer(int _id);
		tPlayer* SelectPlayerByUserId(int _userId);
		bool UpdatePlayer(const tPlayer& _Player);

		bool IsExistRole(int _roleId);
		int InsertRole(const tRole& _Role);
		bool CacheRole(MYSQL_ROW Row);
		tRole* SelectRole(int _roleId);

};

#endif // DATABASE_H


